\section{Laravel基础概念}

与众多PHP框架类似，Laravel也采用了众多软件开发模式，如MVC（参见第\ref{mvc}章）、ORM等等。

\subsection{路由}
所谓路由（Route），是指用户在浏览器地址栏中输入的信息后，决定采用何种程序响应的过程。比如，用户点击注册（http://example.com/reg）后，服务器应该调用对应的注册程序。在Laravel中，路由设置在app/HTTP/routes.php中进行设置。比如：

\begin{lstlisting}[caption={Laravel中的路由设定},label=route]
Route::get('/', function () {
    return view('welcome');
});
\end{lstlisting}

表示当用户访问网站根目录时，向用户显示welcome页面（页面位于blog\textbackslash{}resources\textbackslash{}views目录中，文件名为welcome.blade.php）。Route对象的get方法有两个参数，第一个参数是URI片段，第二个参数是URI片段对应的功能，上例中是一个匿名函数。第二个参数也可以是控制器和相应的方法，如：

\begin{lstlisting}
Route::get('/hello', 'WelcomeController@index');
\end{lstlisting}

上述路由规则表示，当用户访问在地址栏中访问网站的hello页面时，响应以WelcomeController控制器中的index方法。

\subsection{控制器}
Laravel中的控制器存放在app/HTTP/Controllers目录中。Laravel借助于artisan工具快速创建控制器的方式，如要创建WelcomeController，可以运行如下命令：
\begin{lstlisting}
php artisan make:controller WelcomeController
\end{lstlisting}

借助于artisan工具生成的控制器代码如下：

\begin{lstlisting}
<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

class WelcomeController extends Controller
{

}
\end{lstlisting}
从这些代码可以看出，Laravel中的控制器继承自Controller类，都属于App/Http/Controllers命名空间，使用use关键词引用了必要的类。并且控制器的文件名和控制器的类名一致。

当然，一旦掌握了控制器的必要知识，我们也可以使用传统方式，即新建文件然后键入代码的方式，创建控制器。

\subsection{视图}
视图指的是最终呈献给用户的页面，如首页、注册页面等等。Laravel的视图文件存放在resources/views目录中。Laravel的视图文件使用blade模版引擎，视图文件后缀名为.blade.php。

\subsubsection{调用视图}
我们可以在指定路由时调用视图，如代码\ref{route}所示，也可以在控制器中指定调用视图名称：

\begin{lstlisting}
class WelcomeController extends Controller {
	public function index() {
		return view('hello');
	}
}
\end{lstlisting}

在上面的控制器中，我们指定了index方法的功能为返回视图hello。相应地，我们需要在esources/views目录中创建名为hello.blade.php的视图文件：

\begin{lstlisting}
<!DOCTYPE html>
<html>
    <head>
        <title>Laravel</title>

        <link href="https://fonts.googleapis.com/css?family=Lato:100" rel="stylesheet" type="text/css">

        <style>
            html, body {
                height: 100%;
            }

            body {
                margin: 0;
                padding: 0;
                width: 100%;
                display: table;
                font-weight: 100;
                font-family: 'Lato';
            }

            .container {
                text-align: center;
                display: table-cell;
                vertical-align: middle;
            }

            .content {
                text-align: center;
                display: inline-block;
            }

            .title {
                font-size: 96px;
            }
        </style>
    </head>
    <body>
        <div class="container">
            <div class="content">
                <div class="title">Hello</div>
            </div>
        </div>
    </body>
</html>
\end{lstlisting}

这样我们就把路由、控制器和视图结合在一起，运行效果如下图\ref{fig:Laravel-basic}：
\begin{figure}[htbp]
	\centering
	\includegraphics[width=140mm]{raw/Laravel-basic.jpg}
	\caption{Laravel的路由与视图}
	\label{fig:Laravel-basic}
\end{figure}

\subsection{在视图中显示数据}
在上一节中，我们创建了视图，并能通过路由或者控制器调用视图，但这时的视图文件是一个静态HTML文件，不够灵活。在大多数情况下，我们希望视图显示的内容会根据提供的数据不同而不同。

\subsubsection{传递数据的不同方法}
若要在Laravel视图显示数据，则需要在控制器中定义数据并将其传递到视图：

\begin{lstlisting}
class WelcomeController extends Controller {
	public function index() {
		$name = 'Yangjh';
		return view('hello')->with('name', $name);
	}
}
\end{lstlisting}

上述代码中，使用view视图的with方法，将变量\$name传递到视图hello中。with方法还可以使用数组作为参数：

\begin{lstlisting}
class WelcomeController extends Controller {
	public function index() {
		return view('hello')->with([
			'name' => 'Yangjh',
		]);
	}
}
\end{lstlisting}

除了使用with方法之外，Laravel还支持在view方法中传递数据：

\begin{lstlisting}
class WelcomeController extends Controller {
	public function index() {
		$data = ['name' => 'yangjh'];
		return view('hello', $data);
	}
}
\end{lstlisting}

上述代码也能实现将数据(变量name作为数组元素)传递到视图（hello）的功能。也就是说，view方法可以接受数组参数，并将其传递到视图中。下面的代码中，使用compact函数生成数组，也能达到同样的目的：

\begin{lstlisting}
class WelcomeController extends Controller {
	public function index() {
		$name = 'Yangjh';
		return view('hello', compact('name'));
	}
}
\end{lstlisting}

\subsubsection{显示数据的不同方法}
下面，我们看如何在视图中将接收到的数据显示出来：

\begin{lstlisting}
<div class="title">Hello <?=$name;?></div>
\end{lstlisting}

在需要显示数据的地方，使用<?=作为起始标签，以?>结束，在这个标签中，直接使用变量名，就可将变量作为内容插入到视图文件中。除了<?= ?>标签外，还可以使用{{}}作为变量标签：

\begin{lstlisting}
<div class="title">Hello {{$name;}}</div>
\end{lstlisting}

